

char * str = "hello, my first link script!\n";

/**
 * 系统调用：系统调用通过0x80中断实现，其中eax为调用号，
 ebx、ecx、edx等通用寄存器用来传递参数
 */
void print(){
    // WRITE调用是往一个文件句柄写入数据
    // 这里得汇编代码类似于c语言的 
    // int write(int filedesc, char* buffer, int size);

    asm("movl $29,%%edx \n\t"           // size 表示要写入的字节数，使用edx寄存器传递，字符串“Hello world!\n”长度为13字节，所以edx = 13。
        "movl %0,%%ecx  \n\t"           // buffer表示要写入的缓冲区地址，使用ecx寄存器传递，我们这里要输出字符串str，所以ecx = str。
        "movl $0,%%ebx  \n\t"           // filedesc表示被写入的文件句柄，使用ebx寄存器传递，我们这里是要往默认终端（stdout）输出，它的文件句柄为0，即ebx = 0。
        "movl $4,%%eax  \n\t"           // write 的系统调用号为 4
        "int $0x80      \n\t"           // 0x80中断实现 系统调用
        ::"r"(str):"edx","ecx","ebx");
}

void my_exit(){
    asm( "movl $42,%ebx  \n\t"          // ebx表示进程退出码（Exit Code）​
         "movl $1,%eax   \n\t"          // EXIT系统调用
         "int $0x80      \n\t");        // 0x80中断实现 系统调用，EXIT系统调用的调用号为1，即eax = 1
}

void no_main(){
    print();
    my_exit();
}